import observe from './observe.js';
import Dep from './Dep.js';



export default function defineReactive(obj,key,value){
	//因为需要在getter中收集依赖，在setter中触发依赖就必须有dep实例
	const dep = new Dep();

	console.log('我是defineReacytive函数：',key);
	if(arguments.length==2){
		value = obj[key]; 
	};
	//重要：当子元素形成observe时候，形成递归，这个递归不是自己调用自己，而是多个函数的循环调用
	let childrenOb = observe(value);
	Object.defineProperty(obj,key,{
		// 可枚举
		enumerable:true,
		// 可配置
		configurable:true,
		//getter
		get(){
			console.log('正在试图访问'+key+'属性');
			//在getter中收集依赖
			if(Dep.target){
				dep.depend();
				console.log('开始收集依赖depend1');
	            if(childrenOb){
					childrenOb.dep.depend();
					console.log('开始收集依赖depend2');
				}				
			};
			

			return value;
		},
		//setter
		set(newValue){
			console.log('正在试图设置'+key+'属性');
			if(value===newValue)return;
			value =newValue;
			//当设置新值时候，新值也需要被observe，因为新值可能也是对象
			childrenOb = observe(newValue)

			//在setter中触发依赖
			dep.notify();
			return true
		}
	})

}